iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

Day24

音樂與音效

STEP 1

將準備好的音樂及音效匯入Unity中


建立一個名為 Audio 的資料夾 將準備好的音檔拖曳至資料夾中

建立一個名為 AudioManager 的空物件

將匯入的音效檔案拖曳至 AudioManager 物件中作為其子物件

全選上述音效,並將 Play On Awake 欄位 取消勾選

01
02

主要的遊戲音樂會獨立在外面,不會收進 AudioManager 物件當中

03

將匯入的音檔物件重新命名會比較好分辨喔!

STEP 2

建立播放管理器


建立一個名為 AudioManager 的腳本,並將此腳本拖曳至 AudioManager 物件 中

開啟 AudioManager 腳本,輸入以下程式碼並存檔

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public List<GameObject> audioList = new List<GameObject>();

    void Start()
    {

    }

    void Update()
    {

    }

    public void playAudio(string name)
    {
        for (int i = 0; i < audioList.Count; i++)
        {
            if (audioList[i].name == name)
            {
                audioList[i].GetComponent<AudioSource>().Play();
            }
        }
    }
}

回到 Unity 介面,在 AudioManager 物件 中會發現剛剛新增的 Audio List 欄位

將各個音效檔案依序拖曳至 Audio List 當中即可

04
05
06
07

STEP 3

設定各個音效播放的時機


開啟 PlayerController 腳本,將程式碼修改為以下版本並存檔

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class PlayerController : MonoBehaviour
{
		public GameManager gm;
		public AudioManager am;
		public float currentPosY = 0;
		public float speed = 0;
		
		void Start()
		{
				gm = GameObject.Find("GameManager").GetComponent<GameManager>();
				am = GameObject.Find("AudioManager").GetComponent<AudioManager>();
				currentPosY = 0.75f;
				speed = 0.1f;
		}
		
		void Update()
		{
			
		}
		
		private void FixedUpdate()
		{
				if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
				{
						currentPosY = currentPosY + speed;
		
						if (currentPosY >= 5.3f)
						{
								currentPosY = 5.3f;
						}
				}
	
		    if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
		    {
						currentPosY = currentPosY - speed;
		
						if (currentPosY <= -3.3f)
						{
								currentPosY = -3.3f;
						}
		    }
		        gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
		}
		
		private void OnTriggerEnter(Collider collision)
		{
				string type = collision.gameObject.tag;
				GameObject targetObject = collision.gameObject;
		
				if (type == "rabbit")
		    {
				    Debug.Log("hit rabbit");
						am.playAudio("rabbit"); // 播放rabbit音效
						gm.updateRabbitPoint();
						Destroy(targetObject);
		    }
		
				if (type == "cookie")
		    {
				    Debug.Log("hit cookie");
						am.playAudio("cookie"); // 播放cookie音效
						gm.updateCookiePower();
						Destroy(targetObject);
		    }
		
				if (type == "big-rabbit")
		    {
				    Debug.Log("hit big-rabbit");
		    }
		
		
				// 會扣HP的種類
				
				if (type == "floor")
		    {
				    Debug.Log("hit floor");
						if (isInvincible) return;
						am.playAudio("enemy"); // 播放enemy音效
						gm.updateHP(-1);
						damageEffect();
		    }
		
				if (type == "enemy")
		    {
				    Debug.Log("hit enemy");
						if (isInvincible) return;
						am.playAudio("enemy"); // 播放enemy音效
						gm.updateHP(-1);
						damageEffect();
		    }
		}
		
		void damageEffect()
    {
        if (isInvincible == false)
        {
            isInvincible = true;
            hidePlayer();
            Invoke("initDamageEffect", 1.2f);
        }
    }

    bool isInvincible = false;
    int hideCounter = 0;
    int hideTimes = 6;

    void hidePlayer()
    {
        if (hideCounter < hideTimes)
        {
            hideCounter++;
            transform.GetChild(0).gameObject.SetActive(false);
            Invoke("showPlayer", 0.1f);
        }
    }

    void showPlayer()
    {
        transform.GetChild(0).gameObject.SetActive(true);
        Invoke("hidePlayer", 0.1f);
    }

    void initDamageEffect()
    {
        isInvincible = false;
        hideCounter = 0;
    }
}

08

示意圖為 PlayerController 腳本上半部修改後之程式碼

09

示意圖為 PlayerController 腳本下半部修改後之程式碼


上一篇
Day23 / Unity 可愛的 NewJeans 2D 遊戲 - 計分與結算分數
下一篇
Day25 / Unity 可愛的 NewJeans 2D 遊戲 - 補血道具
系列文
初心者限定!設計師帶你學 Unity 3D 遊戲程式設計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言